/**
 * arr.reduce(fn(pre, curr, index, arr),init) 
 * 返回一个遍历完数组后计算的值
 */
//fn(pre, item, index, arr)

Array.prototype.myReduce = function (fn, init) {
  if (typeof fn !== 'function')  throw new TypeError('parameter1 is not a function');
  
  const arr = this
  let res = init ?? arr[0]; //当前数组的第一个元素
  for (let i = init==undefined ? 1 : 0; i < arr.length; i++) {
    res = fn(res, arr[i], i, arr);
  }
  return res;
};

let arr = [1,2,3];
console.log(arr.myReduce((pre, curr) => pre + curr, 0));
console.log(arr.myReduce((pre, curr) => pre + curr, 6));
 
 /**
  * reduce实用技巧
  * reduce有遍历，处理的时候可以拿到上一次的值，可以做一些累计，分类，聚合的逻辑
  */

/**
* 输出指定格式
*/
let arr0 = ['A', 'B', 'C', 'D']
// res = {A:{B:{C:{D:null}}}}
let res = arr0.reduceRight((pre, curr) => {
  return {[curr]:pre}
}, null)
console.log(JSON.stringify(res))